package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.toolkit.NumberToolkit;
import gminet.infra.web.WebException;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import simulaco.business.QuestaoBusiness;
import simulaco.dto.Acao;
import simulaco.dto.ConcursoMateria;
import simulaco.dto.Questao;
import simulaco.dto.QuestaoItem;
import simulaco.dto.Situacao;
import simulaco.dto.UsuarioPerfil;

@ManagedBean(name = "adminConcursoQuestaoAction")
@SessionScoped
public class AdminConcursoQuestaoAction extends WebAction {

    private static final long serialVersionUID = 5001244422316852290L;

    private ConcursoMateria concursoMateria;

    private Questao questao;

    private List<Questao> questoes;

    private int codigoItem;

    private QuestaoItem questaoItem;

    public AdminConcursoQuestaoAction() {

        super();
    }

    public String listar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            setQuestoes(QuestaoBusiness.findByConcursoMateria(getConcursoMateria()));
            pageReturn = "adminListaConcursoQuestoes";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararInclusao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        setAcaoIncluir(true);
        this.codigoItem = 0;
        this.questao = null;
        getQuestao().setConcursoMateria(getConcursoMateria());
        getQuestao().setSituacao(Situacao.HABILITADO);
        return "adminMantemConcursoQuestaoFromLista";
    }

    public String incluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            QuestaoBusiness.insert(getQuestao());
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmQuestao", be);
            pageReturn = "adminMantemConcursoQuestao";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararAlteracao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        setAcaoAlterar(true);
        String pageReturn = "";
        try {
            this.questao = QuestaoBusiness.findByPK(getQuestao());
            if (this.questao == null) {
                throw new WebException("Questão não encontrada.");
            }
            this.codigoItem = getQuestao().getListaItens().size();
            //
            pageReturn = "adminMantemConcursoQuestaoFromLista";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String alterar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            QuestaoBusiness.update(getQuestao());
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmQuestao", be);
            pageReturn = "adminMantemConcursoQuestao";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void adicionarItem() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        getQuestao().getListaItens().add(new QuestaoItem(++this.codigoItem));
    }

    public void excluirItem() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        getQuestao().getListaItens().remove(getQuestaoItem());
    }

    public void executarAcao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        if (getAcao().equals(Acao.ATIVAR) || getAcao().equals(Acao.DESATIVAR)) {
            alterarSituacao();
        } else if (getAcao().equals(Acao.EXCLUIR)) {
            excluir();
        }
    }

    private void alterarSituacao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            if (getAcao().equals(Acao.ATIVAR)) {
                getQuestao().setSituacao(Situacao.HABILITADO);
            } else if (getAcao().equals(Acao.DESATIVAR)) {
                getQuestao().setSituacao(Situacao.DESABILITADO);
            }
            QuestaoBusiness.updateStatus(getQuestao());
            // ATUALIZA LISTA
            setQuestoes(QuestaoBusiness.findByConcursoMateria(getConcursoMateria()));
            // GRAVA MENSAGEM PARA O USUARIO
            String msgAcao = (getAcao().equals(Acao.ATIVAR) ? "habilitada" : "desabilitada");
            addMessage("frmListaQuestoes", "Questão " + msgAcao + " com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaQuestoes", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    private void excluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            QuestaoBusiness.delete(getQuestao());
            // ATUALIZA LISTA
            setQuestoes(QuestaoBusiness.findByConcursoMateria(getConcursoMateria()));
            // GRAVA MENSAGEM PARA O USUARIO
            addMessage("frmListaQuestoes", "Questão excluida com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaQuestoes", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    public ConcursoMateria getConcursoMateria() {
        return concursoMateria;
    }

    public void setConcursoMateria(ConcursoMateria concursoMateria) {
        this.concursoMateria = concursoMateria;
    }

    public Questao getQuestao() {
        if (this.questao == null) {
            this.questao = new Questao();
        }
        return questao;
    }

    public void setQuestao(Questao questao) {
        this.questao = questao;
    }

    public QuestaoItem getQuestaoItem() {
        if (this.questaoItem == null) {
            this.questaoItem = new QuestaoItem();
        }
        return questaoItem;
    }

    public void setQuestaoItem(QuestaoItem questaoItem) {
        this.questaoItem = questaoItem;
    }

    public List<Questao> getQuestoes() {
        return questoes;
    }

    public void setQuestoes(List<Questao> questoes) {
        this.questoes = questoes;
    }

    public void selecionaItemCorreto() {

        //
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        String strCodigo = externalContext.getRequestParameterMap().get("codigoItemQuestao");
        int codigoItem = NumberToolkit.getIntFromString(strCodigo);
        //
        for (QuestaoItem item : getQuestao().getListaItens()) {
            if (codigoItem == item.getCodigo()) {
                item.setItemCorreto(true);
            } else {
                item.setItemCorreto(false);
            }
        }
    }

}
